package config

import (
	"fmt"
	"gin-demo/container"
	"github.com/spf13/viper"
)

// 所有的配置文件对应的对象，私有化

type Config struct {
	Mysql
	log
	Server
}

// 日志的配置对象，私有化

type log struct {
	Level string
}

// server 的配置对象，私有化

type Server struct {
	ListenAddress string
	Port          uint
}

// 数据库的配置对象

type Mysql struct {
	User     string
	Password string
	Host     string
	Port     uint
	Database string
}

//var globalConfig = &Conf{}

func NewLog() *log {
	return &log{
		Level: "info",
	}
}

func NewMysql() *Mysql {
	return &Mysql{
		User:     "root",
		Password: "",
		Host:     "localhost",
		Port:     3306,
		Database: "user",
	}
}

func NewServer() *Server {
	return &Server{
		ListenAddress: "localhost",
		Port:          8080,
	}
}

//默认的构造函数

func NewDefaultConf() *Config {

	return &Config{
		Server: *NewServer(),
		Mysql:  *NewMysql(),
		log:    *NewLog(),
	}
}

//空的构造函数

func (c *Config) Set(conf *Config) {
	c.Mysql = conf.Mysql
	c.log = conf.log
	c.Server = conf.Server

}

func (c *Config) Get() *Config {
	return &Config{
		Mysql:  c.Mysql,
		log:    c.log,
		Server: c.Server,
	}
}

func InitConfig() {
	viper.SetConfigName("application")                  //找寻文件的名字
	viper.SetConfigType("yaml")                         // 找寻文件的类型
	viper.AddConfigPath("D://go_work//gin-demo/config") //.代表当前文件夹找寻，可以多个目录找寻，生成数组
	err := viper.ReadInConfig()                         //读取配置文件
	if err != nil {
		if v, ok := err.(viper.ConfigFileNotFoundError); ok {
			fmt.Println(v)
		} else {
			panic(fmt.Errorf("read config err=%s", err))
		}
	}
	config := new(Config)
	err = viper.Unmarshal(config)
	if err != nil {
		panic("反向序列失败")
	}
	container.Add("config", *config)
}
